package controller

import (
	"ginblog/enum"
	"ginblog/model"
	"ginblog/resp"
	"ginblog/service"
	"ginblog/utils/validator"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

type UserController struct {
	user service.UserService
	r    resp.Resp
}

type UserConInterface interface {
	AddUser(c *gin.Context)
	GetUserById(c *gin.Context)
	UserExist(c *gin.Context)
	GetUsers(c *gin.Context)
	EditUser(c *gin.Context)
	ChangeUserPassword(c *gin.Context)
	DeleteUser(c *gin.Context)
}

// AddUser 添加用户
func (uci *UserController) AddUser(c *gin.Context) {

	// 获取用户传递得到数据
	user := model.User{}
	err := c.ShouldBind(&user)

	// 使用Validate进行数据验证
	msg, code2 := validator.Validate(user)
	if code2 != enum.SUCCESS {
		// 验证没通过
		uci.r.RespData(code2, enum.ERROR.String(), msg, c)
		return
	}

	if user.Username == "" && user.Password == "" {
		uci.r.RespData(enum.ERROR, enum.ERROR.String(), "数据格式有误！", c)
		return
	}

	if err != nil {
		uci.r.RespData(enum.ERROR, enum.ERROR.String(), "数据格式有误！", c)
		return
	}

	// 查询用户名是否被使用
	code := uci.user.CheckUser(user.Username)
	if code != enum.SUCCESS {
		uci.r.RespData(code, code.String(), nil, c)
		return
	}

	// 添加用户到数据库
	code1 := uci.user.CreateUser(&user)
	if code1 != enum.SUCCESS {
		uci.r.RespData(code1, code1.String(), "", c)
		return
	}

	uci.r.RespData(code1, code1.String(), "注册成功！", c)
}

// GetUserById 查询单个用户
func (uci *UserController) GetUserById(c *gin.Context) {
	// 获取前端传递的参数
	// 获取id
	userId, _ := strconv.Atoi(c.Param("id"))

	user := uci.user.GetUserById(userId)

	uci.r.RespData(enum.SUCCESS, enum.SUCCESS.String(), user, c)
}

// UserExist 查询用户是否存在
func (uci *UserController) UserExist(c *gin.Context) {
}

// GetUsers 查询用户列表
func (uci *UserController) GetUsers(c *gin.Context) {
	// 获取用户传输的数据
	// 获取前端传过来的数据 并转换给int类型
	userName := c.Query("username")
	pageSize, _ := strconv.Atoi(c.Query("pageSize"))
	pageNum, _ := strconv.Atoi(c.Query("pageNum"))

	// 判断数据
	if pageNum == 0 {
		pageNum = -1
	}

	users, count, code := uci.user.GetUsers(userName, pageSize, pageNum)
	if code != enum.SUCCESS {
		uci.r.RespData(code, code.String(), nil, c)
	}

	c.JSON(http.StatusOK, gin.H{
		"status":  enum.SUCCESS,
		"message": enum.SUCCESS.String(),
		"data":    users,
		"total":   count,
	})
}

// EditUser 编辑用户
func (uci *UserController) EditUser(c *gin.Context) {
	// 获取前端传递的参数
	// 获取id
	userId, _ := strconv.Atoi(c.Param("id"))

	// 获取修改的数据
	user := model.User{}
	err := c.ShouldBind(&user)
	if err != nil {
		uci.r.RespData(enum.ERROR, enum.ERROR.String(), "数据格式有误！", c)
	}

	//  判断前台传入后用户名是否改变了
	user1 := uci.user.GetUserById(userId)
	if user.Username != user1.Username {
		// 查询用户名是否被使用
		code := uci.user.CheckUser(user.Username)
		if code != enum.SUCCESS {
			uci.r.RespData(code, code.String(), nil, c)
			return
		}
	} else {
		user.Username = ""
	}

	// 修改用户
	code1 := uci.user.EditUser(userId, &user)
	if code1 != enum.SUCCESS {
		uci.r.RespData(code1, code1.String(), "", c)
		return
	}
	uci.r.RespData(code1, code1.String(), "修改成功！", c)
}

// ChangeUserPassword 修改密码
func (uci *UserController) ChangeUserPassword(c *gin.Context) {

	// 获取前端传递的参数
	// 获取id
	userId, _ := strconv.Atoi(c.Param("id"))

	// 获取修改的数据
	users := model.User{}
	err := c.ShouldBind(&users)
	if err != nil {
		uci.r.RespData(enum.ERROR, enum.ERROR.String(), "数据格式有误！", c)
	}

	code := uci.user.UpdatePassword(userId, users.Password)

	if code != enum.SUCCESS {
		uci.r.RespData(code, code.String(), "", c)
		return
	}
	uci.r.RespData(code, code.String(), "修改成功！", c)

}

// DeleteUser 删除用户
func (uci *UserController) DeleteUser(c *gin.Context) {
	// 获取前端传递的参数
	// 获取id
	userId, _ := strconv.Atoi(c.Param("id"))

	code := uci.user.DeleteUser(userId)

	if code != enum.SUCCESS {
		uci.r.RespData(code, code.String(), "", c)
		return
	}
	uci.r.RespData(code, code.String(), "删除成功！", c)
}
